﻿<!DOCTYPE HTML>
<html lang="en">
<head>
<title>#DllLoad - 语法 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="The #DllLoad directive loads a DLL or EXE file before the script starts executing." />
<meta name="ahk:equiv-v1" content="commands/DllCall.htm#load" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

 <h1>#DllLoad</h1>

 <p>在脚本开始执行之前<a href="DllCall.htm#load">加载</a> DLL 或 EXE 文件.</p>

 <pre class="Syntax"><span class="func">#DllLoad</span> <span class="optional">FileOrDirName</span></pre>

<dl>
<h2 id="Parameters">参数</h2>
   <dt>FileOrDirName</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>
    <p>文件或目录的路径, 如下所述. <strong>不得</strong> 包含双引号, 通配符或除分号(<strong>`;</strong>) 外的<a href="../misc/EscapeChar.htm">转义序列</a>.</p>
    <p>内置变量可以用百分号括起来(例如, <code>#DllLoad %内_脚本目录%</code>). 不属于有效变量引用的百分号按原义解释. 除了 <a href="../Variables.htm#Args">A_Args</a> 和内置类外, 所有内置变量都是有效的.</p>
    <p>已知限制: 当编译一个脚本时, 变量由编译器计算, 可能不同于脚本最终执行时返回的值. 支持以下变量: 内_主程序路径, 内_应用数据, 内_常规应用数据, 内_剪贴板, 内_命令行, 内_桌面, 内_常规桌面, 内_是否已编译, 内_此文件路径, 内_我的文档, 内_程序文件, 内_程序, 内_常规程序, 内_脚本目录, 内_脚本全路径, 内_脚本名, 内_空格, 内_开始菜单, 内_常规开始菜单, 内_启动, 内_常规启动, 内_跳格, 内_临时路径, 内_用户名, 内_系统目录.</p>
    <p><strong>文件:</strong> 要加载的 DLL 或 EXE 文件的绝对或相对路径. 如果指定了一个相对路径, 指令将使用与系统函数 <a href="https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibraryw">LoadLibraryW</a> 相同的搜索策略来搜索文件. 注意: <a href="SetWorkingDir.htm">设置工作目录</a> 对 #DllLoad 没有影响, 因为 #DllLoad 是在脚本开始执行之前处理的.</p>
    <p><strong>目录:</strong> 指定目录而不是文件, 以改变随后出现的 #DllLoad  的搜索策略, 其不再需要指定 DLL 或 EXE 的绝对路径. 新的搜索策略与将 <em>Directory</em> 传递给系统函数 <a href="https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setdlldirectoryw">SetDllDirectoryW</a> 相同. 如果省略此参数, 则恢复默认的搜索策略.</p>
    <p class="note"><strong>注意:</strong> 这个参数不是一个表达式, 但可以用引号括起来(可以是 '单引号' 或 "双引号").</p>
  </dd>
</dl>
<h2 id="Remarks">备注</h2>
<p>一旦 DLL 或 EXE 已由该指令加载, 它不能通过调用系统的函数 <a href="https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-freelibrary">FreeLibrary</a> 卸载. 当脚本终止时, 所有加载的文件都会自动卸载.</p>
<p><em>FileName</em> 参数可以有选择地在前面加上 <code>*i</code> 和一个空格, 这将导致程序忽略加载文件的任何失败. 只有当脚本在失败的情况下仍然能够执行时, 才应该使用这个选项, 例如, 如果 DLL 或 EXE 是非必要的, 或者如果脚本被设计为检测失败, 例如:</p>
<pre>#DllLoad "*i MyDLL"
如果 !动态库调用("GetModuleHandle", "str", "MyDLL")
    信息框 "Failed to load MyDLL!"</pre>
<p>如果 <em>FileName</em> 参数指定了一个没有路径的 DLL 名称, 并且文件名扩展名被省略, 则 <em>.dll</em> 将追加到文件名. 为了防止这种情况, 在文件名中包含一个尾随点字符(.).</p>

<h2 id="Related">相关</h2>
<p><a href="DllCall.htm">动态库调用</a></p>
<h2 id="Examples">示例</h2>
<div class="ex" id="ExBasic">
<p><a href="#ExBasic">#1</a></p>
<pre>#DllLoad "%内_我的文档%\MyDLL.dll"</pre>
</div>

</body>
</html>